package judge.happy.number;
/**
 * @Time 2019/12/15
 * @author 王光浩
 * @Need 判断一个数是否是happy数（规则为：对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和，
 *       然后重复这个过程直到这个数变为 1，也可能是无限循环但始终变不到 1。如果可以变为 1，那么这个数就是快乐数。
 * @Method 使用快慢指针。
 *         该题有两个种情况：是快乐数、不是快乐数，如果是快乐数：最后结果归为1；如果不是快乐数则结果在4-16-37-58-89-145-42-20
 *         进行循环，我们可以把这个当成一个带环的链表，而且环在链表的末尾，如果为是快乐数则最后会不断在n值为1这一点进行循环，如果不是
 *         快乐数则会在上面几个数中不断进行循环。所以如果我们使用快慢指针进行判断是否为快乐数时只需判断当快慢指针相遇时值是否为1，为1则
 *         是快乐数，否则不是快乐数。
 *         复杂度分析：时间复杂度分析——O（n）；空间复杂度——O（1）
 */
public class OtherMethod {
	/**使用快慢指针方法进行*/
    public boolean isHappy(int n) {
    	int slow=n;
    	int quick=n;
    	do {
    		slow=this.nextNumber(slow);
    		quick=this.nextNumber(quick);
    		quick=this.nextNumber(quick);
    	}while(slow!=quick);
    	return slow==1;
    	
    }
    /**求出下一个数对应的值*/
    private int nextNumber(int n) {
    	String tem=String.valueOf(n);
    	int len=tem.length();
    	n=0;
    	for(int i=0;i<len;i++) {
    		n+=Math.pow(((int)tem.charAt(i)-48), 2);
    	}
    	return n;
    }

}
